﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.relatorios.entidade;
using EnterpriseLibraryWrapper;
using System.Data;

namespace itau.im.relatorios.dado
{
    public class RelatorioProdutoDB : IRelatorioProdutoDAO
    {
        public IList<ClasseProdutoFinanceiro> ObterClassesProdutoFinanceiro()
        {
            List<ClasseProdutoFinanceiro> lista = null;
            IDataAccessWrapper data = null;
            DataSet ds = null;

            try
            {
                lista = new List<ClasseProdutoFinanceiro>();

                data = EnterpriseLibraryFactory.GetDataAccess();

                ds = data.ExecuteDataSet("DB2IM.IMSEG");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getClasse(linha));
                    }
                }

                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            return new List<ClasseProdutoFinanceiro>();
        }

        public IList<FamiliaProdutoFinanceiro> ObterFamiliasProdutoFinanceiro()
        {
            List<FamiliaProdutoFinanceiro> listasFamiliasProdutosFinanceiros = new List<FamiliaProdutoFinanceiro>();

            IDataAccessWrapper data = null;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                DataSet ds = data.ExecuteDataSet("DB2IM.IMSEH");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        listasFamiliasProdutosFinanceiros.Add(EntidadeFactory.getFamilia(linha));
                    }
                }

                return listasFamiliasProdutosFinanceiros;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listasFamiliasProdutosFinanceiros = null;
                data.Dispose();
                data = null;
            }

            return new List<FamiliaProdutoFinanceiro>();
        }

        public IList<ProdutoFinanceiro> ObterProdutosFinanceiros()
        {
            List<ProdutoFinanceiro> lista = new List<ProdutoFinanceiro>();
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                ds = data.ExecuteDataSet("DB2IM.IMSEI");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getProduto(linha));
                    }
                }

                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosDerivadosPorProduto(int codigoProduto)
        {
            List<ProdutoFinanceiroDerivado> listasProdutosFinanceirosDerivados = new List<ProdutoFinanceiroDerivado>();

            IDataAccessWrapper data = null;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_PROD_FINN", codigoProduto, DbType.Int32));

                DataSet ds = data.ExecuteDataSet("DB2IM.IMSJB");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        listasProdutosFinanceirosDerivados.Add(EntidadeFactory.getProdutoFinanceiroDerivado(linha));
                    }
                }

                return listasProdutosFinanceirosDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listasProdutosFinanceirosDerivados = null;
                data.Dispose();
                data = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(int codigoGrupo)
        {
            //Declaração dos objetos
            IDataAccessWrapper data = null;
            DataSet ds;
            List<ProdutoFinanceiroDerivado> lista = new List<ProdutoFinanceiroDerivado>();

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Adiciona o parâmetro de entrada
                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                //Executa a procedure IMS23
                ds = data.ExecuteDataSet("DB2IM.IMS2W");

                //Verifica se o retorno é válido
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta o objeto e adiciona na lista
                        lista.Add(EntidadeFactory.getProdutoFinanceiroDerivado(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                ds = null;
                data.Dispose();
                data = null;
                lista = null;
            }

            //Retorna a consulta
            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosFinanceirosDerivadosPorGrupoParametros(int codigoGrupo)
        {
            //Declara e instancia o objeto
            List<ProdutoFinanceiroDerivado> listaRetorno = new List<ProdutoFinanceiroDerivado>();
            IDataAccessWrapper data = null;
            DataSet ds;
            DataSet dsProdutoDerivado;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Adiciona os parâmetros
                //data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                //Recupera a consulta
                //ds = data.ExecuteDataSet("DB2IM.IMS12");
                ds = data.ExecuteDataSet("DB2IM.IMSEI");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow rowProduto in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        ProdutoFinanceiro produto = EntidadeFactory.getProduto(rowProduto);

                        data.ParameterIn.Clear();
                        data.ParameterIn.Add(new ParameterInWrapper("@COD_PROD_FINN", produto.CodigoProdutoFinanceiro, DbType.Int32));

                        dsProdutoDerivado = data.ExecuteDataSet("DB2IM.IMSJB");

                        if (dsProdutoDerivado.Tables.Count > 0 && dsProdutoDerivado.Tables[0].Rows.Count > 0)
                        {
                            foreach (DataRow rowProdutoDerivado in dsProdutoDerivado.Tables[0].Rows)
                            {
                                listaRetorno.Add(EntidadeFactory.getProdutoFinanceiroDerivado(rowProdutoDerivado));
                            }
                        }
                    }
                }

                return listaRetorno;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Finaliza os objetos
                data.Dispose();
                data = null;
                ds = null;
                listaRetorno = null;
            }

            //Retorna a consulta
            return new List<ProdutoFinanceiroDerivado>();
        }
    }
}
